// TODO mettre des exceptions dans proximo pais
// TODO mettre une exception dans getDificultad
package edu.algo3.algoThief.dao;

import java.util.ArrayList;

import edu.algo3.algoThief.domain.Juego;
import edu.algo3.algoThief.domain.Jugador;
import edu.algo3.algoThief.domain.Tiempo;
import edu.algo3.algoThief.util.Constants;


public class Repositorio {

	// ********* Variables de instancia **********
	
	/*static Contexto contexto = Contexto.getContexto(); // Por construccion Contexto es un singleton
	static String proximoPais = new String();*/
	
	
	// ********* Constructores **********
	
	public Repositorio()
	{
			
	}
	
	// ********* getters **********
	
	/*
	 * 	pistas
	 * 	ladron / sospechoso
	 * 	paises
	 * 	objeto
	 * 	guardar
	 * 	cargar
	 */
		
	// Pistas
	
	public static String getPistaLadron()
	{
		return(PistasLadron.getPista(getDificultad(), Juego.getInstance().getContextoDelJuego().getCaso().getLadron().getApellido()));
	}
	
	public static String getPistaPais()
	{
		return PistasPais.getPista(getDificultad(), proximoPais(), Juego.getInstance().getContextoDelJuego().getEdificioActual().getDescripcion());
	}
	
	// Informaciones sobre Ladron / sospechosos
	
	public static ArrayList<String> getSospechososApellidos()
	{
		return DatosSospechosos.getListaSospechosos();
	}
	
	public static String getNombre(String sospechosoApellido)
	{
		return repositorioXML.getDatosSospechoso(sospechosoApellido).get(1);
	}
	
	public static String getSexo(String sospechosoApellido)
	{
		return repositorioXML.getDatosSospechoso(sospechosoApellido).get(2);
	}
	
	public static String getHobby(String sospechosoApellido)
	{
		return repositorioXML.getDatosSospechoso(sospechosoApellido).get(3);
	}
	
	public static String getCabello(String sospechosoApellido)
	{
		return repositorioXML.getDatosSospechoso(sospechosoApellido).get(4);
	}
	
	public static String getSenia(String sospechosoApellido)
	{
		return repositorioXML.getDatosSospechoso(sospechosoApellido).get(5);
	}
	
	public static String getVehiculo(String sospechosoApellido)
	{
		return repositorioXML.getDatosSospechoso(sospechosoApellido).get(6);
	}
	
	public static ArrayList<ArrayList<String>> getDatosSospechosos()
	{
		DatosSospechosos datosSospechosos = new DatosSospechosos();
		return datosSospechosos.getTodosLosDatos();
	}
	
	// Informaciones sobre paises
	
	public static ArrayList<String> getTodosLosPaises()
	{
		return DatosPaises.getListaDePaises();
	}
	
	public static String getCiudad(String pais)
	{
		return repositorioXML.getDatosPais(pais).get(0);
	}
	
	public static String getDescripcion(String pais)
	{
		return repositorioXML.getDatosPais(pais).get(3);
	}
	
	public static double getLongitud(String pais)
	{
		return Double.parseDouble(repositorioXML.getDatosPais(pais).get(1));
	}
	
	public static double getLatitud(String pais)
	{
		return Double.parseDouble(repositorioXML.getDatosPais(pais).get(2));
	}
	
	// Informaciones sobre objeto
		
	public static ArrayList<String> getObjetos(String valor)
	{
		return DatosObjetosRobados.getListaNombres(valor);
	}
	
	public static String getObjetoDescripcion(String nombreObjeto)
	{
		return DatosObjetosRobados.getDescipcionDe(nombreObjeto);
	}
	
	// Guardar
	
	public static ArrayList<String> getListaDeJugadores()
	{
		return repositorioXML.getListaJugadores();
	}
	
	public static void Guardar(Jugador jugador)
	{
		// Jugador
		String jugadorNombre = jugador.getNombre();
		int jugadorArrestos = jugador.getArrestos();
		String jugadorPistaActual = jugador.getPistaActual().getPista();
		int jugadorNumeroDeEdificiosVisitados = jugador.getNumeroDeEdificiosVisitados();
		boolean jugadorYaHeridoConCuchillo = jugador.getYaHeridoConCuchillo();
		boolean estaEnCiudadIncorrecta = jugador.estaEnCiudadIncorrecta();
		String paisActual = jugador.getCiudadActual().getPais();
		
		String jugadorEdificioActual = new String();
		if(jugador.getContextoDelJuego().getEdificioActual() != null)
		{
			jugadorEdificioActual = jugador.getContextoDelJuego().getEdificioActual().getDescripcion();
		}
		else { jugadorEdificioActual = "";}
		
		jugador.getTiempo();
		// Tiempo
		int tiempo = Tiempo.getTiempo();
		
		// OrdenDeArresto
		String ordenDeArrestoApellido = jugador.getOrdenDeArresto().getApellido();
		String ordenDeArrestoSexo = jugador.getOrdenDeArresto().getSexo();
		String ordenDeArrestoSenia = jugador.getOrdenDeArresto().getSenia();
		String ordenDeArrestoCabello = jugador.getOrdenDeArresto().getCabello();
		String ordenDeArrestoVehiculo = jugador.getOrdenDeArresto().getVehiculo();
		String ordenDeArrestoHobby = jugador.getOrdenDeArresto().getHobby();
		
		// Ladron
		String ladronApellido = jugador.getContextoDelJuego().getCaso().getLadron().getApellido();
		
		// ObjetoRobado
		String objetoRobadoNombre = jugador.getContextoDelJuego().getCaso().getLadron().getObjetoRobado().getNombre();
		
		//RutaDeEscape
		ArrayList<String> paisesDeEscape = jugador.getContextoDelJuego().getCaso().getLadron().getRutaDeEscape().getPaisesDeEscapeAGuardar();
		
		repositorioXML.guardar(
				jugadorNombre, 
				jugadorArrestos, 
				jugadorPistaActual, 
				jugadorNumeroDeEdificiosVisitados, 
				jugadorYaHeridoConCuchillo,
				estaEnCiudadIncorrecta,
				jugadorEdificioActual,
				paisActual,
				tiempo,
				ordenDeArrestoApellido,
				ordenDeArrestoSexo,
				ordenDeArrestoSenia,
				ordenDeArrestoCabello,
				ordenDeArrestoVehiculo,
				ordenDeArrestoHobby,
				ladronApellido,
				objetoRobadoNombre,
				paisesDeEscape);
		
	}
	
	public static void borrar(String nombreJugador)
	{
		repositorioXML.borrarPartidaDe(nombreJugador);
	}
	
		// Cargar
	
	public static int cargarJugadorArrestos(String jugadorNombre)
	{
		return repositorioXML.obtieneJugadorArrestos(jugadorNombre);
	}
	
	public static String cargarJugadorPistaActual(String jugadorNombre)
	{
		return repositorioXML.obtieneJugadorPistaActual(jugadorNombre);
	}
	
	public static int cargarJugadorNumeroDeEdificiosVisitados(String jugadorNombre)
	{
		return repositorioXML.obtieneJugadorNumeroDeEdificiosVisitados(jugadorNombre);
	}
	
	public static Boolean cargarJugadorYaHeridoConCuchillo(String jugadorNombre)
	{
		return repositorioXML.obtieneJugadorYaHeridoConCuchillo(jugadorNombre);
	}
	
   public static Boolean cargarEstaEnCiudadIncorrecta(String jugadorNombre)
    {
        return repositorioXML.obtieneEstaEnCiudadIncorrecta(jugadorNombre);
    }
	   
	public static String cargarJugadorEdificioActual(String jugadorNombre)
	{
		return repositorioXML.obtieneJugadorEdificioActual(jugadorNombre);
	}
	
	public static String cargarPaisActual(String jugadorNombre)
	{
		return repositorioXML.obtienePaisActual(jugadorNombre);
	}
	
	public static int cargarTiempo(String jugadorNombre)
	{
		return repositorioXML.obtieneTiempo(jugadorNombre);
	}
	
	public static String cargarOrdenDeArrestoApellido(String jugadorNombre)
	{
		return repositorioXML.obtieneOrdenDeArrestoApellido(jugadorNombre);
	}
	
	public static String cargarOrdenDeArrestoSexo(String jugadorNombre)
	{
		return repositorioXML.obtieneOrdenDeArrestoSexo(jugadorNombre);
	}
	
	public static String cargarOrdenDeArrestoSenia(String jugadorNombre)
	{
		return repositorioXML.obtieneOrdenDeArrestoSenia(jugadorNombre);
	}
	
	public static String cargarOrdenDeArrestoCabello(String jugadorNombre)
	{
		return repositorioXML.obtieneOrdenDeArrestoCabello(jugadorNombre);
	}
	
	public static String cargarOrdenDeArrestoVehiculo(String jugadorNombre)
	{
		return repositorioXML.obtieneOrdenDeArrestoVehiculo(jugadorNombre);
	}
	
	public static String cargarOrdenDeArrestoHobby(String jugadorNombre)
	{
		return repositorioXML.obtieneOrdenDeArrestoHobby(jugadorNombre);
	}
	
	public static String cargarLadronApellido(String jugadorNombre)
	{
		return repositorioXML.obtieneLadronApellido(jugadorNombre);
	}
	
	public static String cargarObjetoRobadoNombre(String jugadorNombre)
	{
		return repositorioXML.obtieneObjetoRobadoNombre(jugadorNombre);
	}
	
	public static ArrayList<String> cargarPaisesDeEscape(String jugadorNombre)
	{
		return repositorioXML.obtienePaisesDeEscape(jugadorNombre);
	}
	
	
	// ********* Metodos de instancia **********
	
	private static String proximoPais()
	{
		ArrayList<String> listaDePais = Juego.getInstance().getContextoDelJuego().getCaso().getLadron().getRutaDeEscape().getPaisesDeEscape();
		String pais = Juego.getInstance().getJugador().getCiudadActual().getPais();
		
		return listaDePais.get(listaDePais.indexOf(pais)+1);
	}
	
	private static String getDificultad()
	{
		String dificultad = new String();
		switch (Juego.getInstance().getContextoDelJuego().getCaso().getGradoDeDificultad())
		{
			case Constants.GRADO_DE_DIFICULTAD_FACIL: 
				dificultad = "facil"; 
			break;
			case Constants.GRADO_DE_DIFICULTAD_MEDIO:
				dificultad = "media";
			break;
			case Constants.GRADO_DE_DIFICULTAD_DIFICIL:
				dificultad = "dificil";
			break;
			default: System.out.println("el grado de dificultad no existe");
		}
		return dificultad;
	}
	
	
}
